package com.peanut.boot.controller;

import com.peanut.boot.entiity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * @className: com.peanut.boot.controller-> paraCotroller
 * @description: 测试请求参数的接收方式
 * @author: chenhs
 * @createDate: 2021-09-23 21:47
 * @version: 1.0
 * 注解
 * servlertAPI
 * 复杂对象
 * 自定义对象
 * rest风格
 */
@Slf4j
@RestController
public class paraCotroller {
    //    rest风格 http://localhost:8080/testRest/12/黄色
    @RequestMapping(value = "/testRest/{id}/{color}")
    public String testRest(@PathVariable("id") Integer id,
                           @PathVariable("color") String color,
                           @PathVariable Map<String, String> map
    ) {
        log.info("接收到的参数：" + id);
        return "接收到的参数：" + id;
    }

    /**
     * ---------------------------------注解方式--------------------------------------------------
     */
    @RequestMapping(value = "/testNote")
    public String testNote(@RequestParam String name) {
        log.info("接收到的参数：" + name);
        return "接收到的参数：" + name;
    }

    /**
     * 获取请求头信息 ，Map<String,String> map 获取所有的请求头信息，注意 map 只能是 <String ,String>
     *
     * @RequestHeader(value="Cookie") 获取指定的请求头信息。
     * @CookieValue("_ge") String _ga  获取指定cookie的值。
     */
    @RequestMapping(value = "/testRequestHeader")
    public String testNote(
//            获取所以请求头信息
            @RequestHeader Map<String, String> map,
//                           获取请求头的指定信息
            @RequestHeader(value = "Cookie") String cookie,
//                           获取指定cookie
            @CookieValue("_ge") String _ga,
//                           获取请求体
            @RequestBody String content,
//            获取指定的session中的值
            @RequestAttribute(value = "mag") String s
    ) {
        log.info("接收到的参数：" + map.toString());
        return "接收到的参数：" + map.toString();
    }

    /**
     * 测试矩阵
     * http://localhost:8080/testMatrixVariable/parems;name='张三';age=12,13 查询姓名叫张三 年龄在12和133岁的人。
     * 矩阵变量默禁用，态需要手动开启。
     * 原理：对于路径的处理，UrlPathHelper 进行解析
     */
    @RequestMapping(value = "/testMatrixVariable1/{path}")
    public String testMatrixVariable1(
//            获取单个参数
            @MatrixVariable(value = "name") String name,
//            获取单个参数
            @MatrixVariable(value = "age") List<String> age,
//            获取所有的参数,w我什么map数组解析不完？？
            @MatrixVariable Map<String, String> map

    ) {

        return "success";
    }

    /**
     * http://localhost:8080/testMatrixVariable/1;name=张三;age=12/2;name=李四;age=13
     * pathVar 指定获取那个路径的值
     */
    @RequestMapping(value = "/testMatrixVariable2/{path1}/{path2}")
    public String testMatrixVariable2(
//            pathVar 指定获取那个路径的值
            @MatrixVariable(value = "name", pathVar = "path2") String name,
//            获取所有的参数,w我什么map数组解析不完？？ 为什么获取了路径一的值啊？？
            @MatrixVariable Map<String, String> map

    ) {

        return "success";
    }

    /**
     * -------------------------servlertAPI-----------------------------------------------
     * HttpServletRequest request,
     * HttpServletResponse response,
     * HttpSession session
     */
    @RequestMapping(value = "/testServletAPI")
    public String testServletAPI(HttpServletRequest request,
                                 HttpServletResponse response,
                                 HttpSession session
    ) {
        String name = request.getParameter("name");
        log.info("接收到的参数：" + name);
        return "接收到的参数：" + name;
    }

    /**
     * ---------------------直接将接收的参数当做方法体的参数----------------------------------------------------
     * 支持所有类型
     * 基本类（String Intager....）
     * 自定义的实体（User ...）
     * 集合、数组、map(list、arrary、map)
     */
    //自定义对象
    @RequestMapping(value = "/testDiy")
    public String testDiy(User user) {
        log.info("接收到的参数：" + user.toString());
        return "接收到的参数：" + user.toString();
    }

    //数组
    @RequestMapping(value = "/testComplex")
    public String testComplex(String[] array) {
        log.info("接收到的参数：" + array.toString());
        return "接收到的参数：" + array.toString();
    }

    @RequestMapping(value = "/testMap")
    public String testMap(Map<String, String> map) {
        log.info("接收到的参数：" + map.toString());
        return "接收到的参数：" + map.toString();
    }
}
